#pragma once
#include "Block.h"

namespace AppliedCryptography
{
	namespace AES
	{
		namespace AC = AppliedCryptography;

		enum EBlockSize
		{
			block128bit = 16,
		};

		template<AC::AES::EBlockSize TBlockSize>
		class Block : public AC::Block<TBlockSize>
		{
		public:
			Block() : AC::Block<TBlockSize>()
			{ /*...*/ };

			Block(AC::Block<AC::AES::block128bit>& block) : AC::Block<AC::AES::block128bit>(block)
			{ /*...*/ };

			explicit Block(const std::vector<byte>& contentBytes) : AC::Block<TBlockSize>(contentBytes)
			{ /*...*/ };

			virtual ~Block()
			{ /*...*/ };
		};

		class Plaintext : public AC::AES::Block<AC::AES::block128bit>
		{
		public:
			Plaintext() : AC::AES::Block<AC::AES::block128bit>()
			{ /*...*/ };

			explicit Plaintext(const std::vector<byte>& contentBytes) : AC::AES::Block<AC::AES::block128bit>(contentBytes)
			{ /*...*/ };

			virtual ~Plaintext()
			{ /*...*/ };
		};

		class Chypertext : public AC::AES::Block<AC::AES::block128bit>
		{
		public:
			Chypertext() : AC::AES::Block<AC::AES::block128bit>()
			{ /*...*/ };

			explicit Chypertext(const std::vector<byte>& contentBytes) : AC::AES::Block<AC::AES::block128bit>(contentBytes)
			{ /*...*/ };

			virtual ~Chypertext()
			{ /*...*/ };
		};

		class IV : public AC::AES::Block<AC::AES::block128bit>
		{
		public:
			IV() : AC::AES::Block<AC::AES::block128bit>()
			{ /*...*/ };

			IV(AC::Block<AC::AES::block128bit>& block) : AC::AES::Block<AC::AES::block128bit>(block)
			{ /*...*/ };

			explicit IV(const std::vector<byte>& contentBytes) : AC::AES::Block<AC::AES::block128bit>(contentBytes)
			{ /*...*/ };

			virtual ~IV()
			{ /*...*/ };
		};
	};
};

